package com.qdlc.p2p.dal.dao;

import java.util.Date;
import java.util.List;

import com.qdlc.p2p.dal.common.dao.BaseDao;
import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.Borrow;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.model.BorrowModel;

/**
 * 标Dao
 *
 * @author xx
 * @version 2.0
 * @since 2014年4月4日
 */

/**
 * @author Administrator
 */
public interface BorrowDao extends BaseDao<Borrow> {

    /**
     * @param borrow
     */
    void modifyBorrowAndRepay(Borrow borrow);

    /**
     * 首页借款标列表查询
     *
     * @param model
     * @return
     */
    List<BorrowModel> getIndexList(BorrowModel model);

    /**
     * 未完成的净值标
     *
     * @param userId
     * @return
     */
    int unfinshJinBorrowCount(long userId);

    /**
     * 净值标待还本息
     *
     * @param userId
     * @return
     */
    double getRepayTotalWithJin(long userId);

    /**
     * 投标
     *
     * @param id      标ID
     * @param account 投标金额
     * @param scales  投标进度
     * @param status  投标状态
     */
    Borrow tenderUpdate(long id, double account, double scales, int status, int tenderTimes);

    /**
     * 更新流转标次数
     *
     * @param borrow
     * @return
     */
    void updateFlowTotalYesCount(Borrow borrow);

    /**
     * 审核
     *
     * @param id
     * @param status
     * @param preStatus
     */
    void updateStatus(long id, int status, int preStatus);

    /**
     * 修改状态
     *
     * @param id     标ID
     * @param status 状态
     */
    void updateStatus(long id, int status);

    /**
     * 修改定时时间
     *
     * @param id   标ID
     * @param time 定时时间
     */
    void updatefixedTime(long id, Date time);

    /**
     * 修改登记时间
     *
     * @param id   标ID
     * @param time 登记时间
     */
    void updateRegisterTime(long id, Date time);

    /**
     * 根据标名称获得标的详情
     *
     * @param name
     * @return
     */
    Borrow getBorrowByName(String name);

    /**
     * 统计发标待审总数
     *
     * @param status
     * @return
     */
    int trialCount(int status);

    /**
     * 统计满标复审总数
     *
     * @param status
     * @return
     */
    int fullCount(int status);

    /**
     * 已成交的借款数
     *
     * @return
     */
    Object[] countByFinish();

    /**
     * 获得招标中的标
     *
     * @param model
     * @param params
     * @return PageDataList<Borrow>
     */
    @SuppressWarnings("rawtypes")
    PageDataList<Borrow> getInviteList(BorrowModel model, List params);

    /**
     * 获得非流转的标
     *
     * @param borrowId 标ID
     * @return Borrow
     */
    Borrow findNotFlow(long borrowId);

    /**
     * 修改标的标号
     *
     * @param borrowId 标ID
     * @param bidNo    标号
     */
    void modifyBidNo(long borrowId, String bidNo);

    /**
     * 修改标的担保方登记号
     *
     * @param borrowId 标ID
     * @param bidNo    标号
     */
    void modifyGuaranteeNo(long borrowId, String guaranteeNo);

    /**
     * 正在借款项目个数
     *
     * @param userId
     * @return
     */
    public int findByStatusAndUserId(long userId, int status1, int status2);

    /**
     * 正在借款项目金额
     *
     * @param userId
     * @return
     */
    public double findAccountTotalByStatus(long userId, int status1, int status2);

    /**
     * 用户中心可投资的标
     *
     * @param user
     * @return
     */
    public List<Borrow> getInvestList(User user);

    /**
     * 投资列表及后台标分页方法
     *
     * @param model 标model
     * @return borrow信息
     */
    public PageDataList<Borrow> getList(BorrowModel model);

    /**
     * 只在首页显示的标
     *
     * @param model 标model
     * @return borrow信息
     */
    public PageDataList<Borrow> getBorrowListForIndex(BorrowModel model);

    /**
     * 体验标显示
     *
     * @param model 标model
     * @return borrow信息
     */
    PageDataList<Borrow> getBorrowListForIndexExp(BorrowModel model);

    /**
     * 体验标显示最后一个满标用
     *
     * @param model 标model
     * @return borrow信息
     */
    PageDataList<Borrow> getLastBorrowForIndexExp(BorrowModel model);

    /**
     * 根据时间获取借款金额
     *
     * @param date
     * @return 借款金额
     */
    double getBorrowAccountByDate(String date);

    /**
     * 通过标号查询
     *
     * @param name
     * @return
     */
    Borrow getBorrowByBidNo(String bidNo);

    /**
     * 通过用户Id查询
     *
     * @param name
     * @return
     */
    List<Borrow> getBorrowByUserId(long userId);

    /**
     * 成功发标个数
     */
    int count();

    /**
     * 获取当前担保公司正在担保的标的总个数
     *
     * @param userId
     * @return 标的总信息
     */
    int getGuaranteeingCount(long userId);

    /**
     * 获取当前担保公司正在担保的标的总金额信息
     *
     * @param userId
     * @return 标的总信息
     */
    double getGuaranteeingAccount(long userId);

    /**
     * 获取当前担保公司待登记的标的总个数
     *
     * @param userId
     * @return 标的总信息
     */
    int getNeedGuaranteeRegisteCount(long userId);

    /**
     * 获取当前担保公司待登记的标的总金额信息
     *
     * @param userId
     * @return 标的总信息
     */
    double getNeedGuaranteeRegisteAccount(long userId);

    /**
     * 获取当前担保公司待登记的标的信息列表
     *
     * @param userId
     * @return 标的总信息
     */
    List<Borrow> getNeedGuaranteeRegisteList(long userId);

    /**
     * 逾期项目总数
     */
    int getAllOverduedCount();

    /**
     * 逾期中项目总数
     */
    int getAllOverdueingCount();

    /**
     * 逾期中项目金额
     */
    double getAllOverdueingMomeny();

    /**
     * 项目总金额
     */
    double getAllMomeny();

    /**
     * 逾期项目金额
     */
    double getAllOverduedMomeny();

    /**
     * 根据标状态获取个数
     */
    double getMomenyByStatus(int status);

    /**
     * 已满标未复审的项目金额
     */
    double getVerifyFullMomeny();

    /**
     * 获取已确认待初审的借款列表
     *
     * @param model
     * @return
     */
    PageDataList<Borrow> getConfirmedBorrowList(BorrowModel model);

    /**
     * 更新borrow表中的待还与repayment保持一致
     *
     * @param borrowId
     * @param repayMoney
     */
    public void updateRepaymentAccount(long borrowId, double repayMoney);

    /**
     * 获取环迅待审个数
     *
     * @return
     */
    long ipsTrialCount();

    /**
     * 根据时间获取借款用户个数
     *
     * @param date
     * @return
     */
    int getBorrowCountByDate(String date);

    /**
     * 当月借款金额或人数分布
     *
     * @param type
     * @param i
     * @param date
     * @return
     */
    double getCountByTypeAndDate(int type, int i, String date);

    /**
     * 借款产品金额或人数分布
     *
     * @param type
     * @param borrowType
     * @param date
     * @return
     */
    double getCountByTypeAndBorrowTypeAndDate(int type, int borrowType, String date);

    /**
     * 成交金额或人数
     *
     * @param type
     * @param borrowType
     * @param date
     * @return
     */
    double getDealCountByTypeAndBorrowTypeAndDate(int type, int borrowType, String date);

    /**
     * 标成交笔数或金额及同比值
     *
     * @param type
     * @param borrowType
     * @param date
     * @return
     */
    double getDealByTypeAndBorrowTypeAndDate(int type, int borrowType, String date);

    /**
     * 根据实际获取交易额
     *
     * @param date
     */
    double getTurnoverByTypeAndDate(int type, String date);

    /**
     * 平台累计借款人
     *
     * @param date
     * @return
     */
    double getCumulativeBorrowByDate(String date);

    /**
     * 根据时间得到借款者身份证号码
     *
     * @return
     */
    List<String> getBorrowCardIdsByDate(String date);

    /**
     * 获取尚未满标的最后一个借款标
     *
     * @return
     */
    Borrow getLastBorrow();

    /**
     * 根据状态和标id获取标信息
     *
     * @return
     */
	List<Borrow> getBorrowByStatusAndIds(int status, List<Long> ids);

}
